package com.jijs.main;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

import com.jijs.crawldb.DBManager;
import com.jijs.crawler.Crawler;
import com.jijs.fetcher.Executor;
import com.jijs.model.CrawlDatum;
import com.jijs.model.CrawlDatums;
import com.jijs.plugin.berkeley.BerkeleyDBManager;

/**
 * WebCollector爬取JS加载的数据很简单，首先需要加入selenium的所有jar包，maven项目向pom.xml中添加下面代码即可：
 * 
 * <dependency> <groupId>org.seleniumhq.selenium</groupId>
 * <artifactId>selenium-java</artifactId> <version>2.44.0</version>
 * </dependency> 下面这个例子可以获取加载完成后的页面：
 * 
 * 本教程演示如何利用WebCollector爬取javascript生成的数据
 *
 * @author jijs
 */
public class DemoSeleniumJS {

	static {
		// 禁用Selenium的日志
		Logger logger = Logger.getLogger("com.gargoylesoftware.htmlunit");
		logger.setLevel(Level.OFF);
	}

	/**
	 * 使用Selenium等模拟浏览器进行异步数据的爬取，效率较低，对于大多数情况，如果不是很麻烦，尽量想办法分析网页的Ajax请求，
	 * 找出Ajax请求数据的规律。对于较简单的Ajax，即单纯的http
	 * get请求，找到请求URL的拼接规律，生成URL，将URL作为爬虫的种子，即可爬取Ajax请求结果
	 * 。对于较为复杂的Ajax请求，例如需要使用http
	 * post方法的请求，可以自己构架爬虫的Requester。很多瀑布流的网站都可以通过简单地Ajax请求分析方法轻松抓取到数据。
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		Executor executor = new Executor() {
			@Override
			public void execute(CrawlDatum datum, CrawlDatums next)
					throws Exception {
				HtmlUnitDriver driver = new HtmlUnitDriver();
				driver.setJavascriptEnabled(true);
				driver.get(datum.getUrl());
				WebElement element = driver
						.findElementByCssSelector("span#outlink1");
				System.out.println("反链数:" + element.getText());
			}
		};

		// 创建一个基于伯克利DB的DBManager
		DBManager manager = new BerkeleyDBManager("crawl");
		// 创建一个Crawler需要有DBManager和Executor
		Crawler crawler = new Crawler(manager, executor);
		crawler.addSeed("http://seo.chinaz.com/?host=www.tuicool.com");
		crawler.start(1);
	}

}
